<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../resources/common.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>

<script>
description("Test importing and exporting an EC public key in raw format.");

jsTestIsAsync = true;

// P-256 key in uncompressed form
var kUncompressedHex = "044EA34391AA73885454BC45DF3FDCC4A70262FA4621FFE25B5790590C340A4BD9265EF2B3F9A86E2959A960D90323465D60CD4A90D314C5DE3F869AD0D4BF6C10";

// The same key as above but in compressed form.
var kCompressedHex = "024ea34391aa73885454bc45df3fdcc4a70262fa4621ffe25b5790590c340a4bd9";

var algorithm = {name: "ECDH", namedCurve: "P-256"};
var extractable = true;

debug("Importing raw (uncompressed) public key...");
crypto.subtle.importKey("raw", hexStringToUint8Array(kUncompressedHex), algorithm, extractable, []).then(function(result) {
    publicKey = result;
    shouldBe("publicKey.toString()", "'[object CryptoKey]'");
    shouldBe("publicKey.type", "'public'");
    shouldBe("publicKey.usages", "[]");
    shouldBe("publicKey.algorithm.name", "'ECDH'");
    shouldBe("publicKey.algorithm.namedCurve", "'P-256'");

    debug("Exporting to raw...");
    return crypto.subtle.exportKey("raw", publicKey);
}).then(function(result) {
    bytesShouldMatchHexString("Exported to raw", kUncompressedHex, result)

    debug("Importing raw (compressed) public key...");
    return crypto.subtle.importKey("raw", hexStringToUint8Array(kCompressedHex), algorithm, extractable, []);
}).then(function(result) {
    publicKey = result;
    shouldBe("publicKey.toString()", "'[object CryptoKey]'");
    shouldBe("publicKey.type", "'public'");
    shouldBe("publicKey.usages", "[]");
    shouldBe("publicKey.algorithm.name", "'ECDH'");
    shouldBe("publicKey.algorithm.namedCurve", "'P-256'");

    debug("Exporting to raw...");
    return crypto.subtle.exportKey("raw", publicKey);
}).then(function(result) {
    bytesShouldMatchHexString("Exported to raw", kUncompressedHex, result)

    debug("Importing invalid raw public key...");
    return crypto.subtle.importKey("raw", hexStringToUint8Array("040708"), algorithm, extractable, []);
}).then(failAndFinishJSTest, function(result) {
    logError(result);
}).then(finishJSTest, failAndFinishJSTest);
</script>

</body>
</html>
